R u Ready? HS2025 | Psychologie der Digitalisierung - Einheit 9

Sandra Grinschgl, Aaron Friedli, Lars Schilling

R u Ready? Reproduzierbare Datenaufbereitung und -analyse mit R

HS 2025


LV-Leitung: Dr. Sandra Grinschgl / MSc. Aaron Friedli
Tutor: BSc. Lars Schilling


9. Einheit, 12.11.2025

Heute:

Besprechung Hands On Block 4 & Hausübung 1:

  • Scheint sehr gut gelungen zu sein!

Probleme beim Einlesen –> Keine NAs sondern nur leere Zellen –> Andere Funktionen als read_delim genutzt.

data <- read_delim("raw/fake_bfi_dataset.csv", delim = ";")

bfi_10 <- drop_na(data)

Besprechung Hausübung 1:

Effizienter Code Beispiel aus den Musterlösungen mit across()

Argument 1: cols = –> welche colums sollen bearbeitet werden

Argument 2: .fns 👉 Welche Funktion wenden wir auf die cols. an.

data_bfi_recoded <- clean_data_bfi_10 |> 
  mutate(
    across(
      c(bfi_extra_1_r, bfi_agree_2_r, bfi_consc_2_r, bfi_neuro_2_r, bfi_open_2_r),
      ~ case_when(
        . == 1 ~ 5,
        . == 2 ~ 4,
        . == 3 ~ 3,
        . == 4 ~ 2,
        . == 5 ~ 1
      )
    )
  )

#Sparsamere Alternative

data_bfi_recoded <- clean_data_bfi_10 |>
  mutate(
    across(ends_with("_r"), ~ 6 - .)  # 6- Minus current Value . 
  )


data_bfi_recoded <- clean_data_bfi_10 |>
  mutate(
    across(ends_with("_r"), function(x) 6 - x) # Umgeschrieben
  )

Anonyme Funktionen

Hausübung 1

Falls eure gerenderten Skripte bei den Peer-Partnern nicht richtig angezeigt werden 👉 Im Header des Quarto-Dokuments

embed-resources = true

Genzplyr 💅


Falls euch die dplyr() Funktionen zu Öde sind 😄genzplyr - Hadley Wickham

library(genzplyr)

penguins |> 
  vibe_check(island, species, sex)
  yeet(island == "Biscoe")

Heute:

  • Wide - Long
  • Datenqualität (Schiefe, Kurtoseis, Ausreisser, Skalenreliabilität)

Wide to Long Tranformation:

  • Wide: Jede Zeile bezieht sich auf eine Person und beinhaltet alle Messzeitpunkte

  • Long: Pro Messung (repeated measures) eine Zeile, Personen strecken sich über mehrere Zeilen hinweg.

👉 Long Format is häufig benötigt für Analysen mit einem repeated measures Faktor

Transformation wide to long



Wie müssen wir den folgenden Datensatz transformieren, um ihn ins long Format zu bekommen?

id messzeitpunkt_t1 messzeitpunkt_t2 messzeitpunkt_t3
1 10 14 18
2 12 15 17
3 9 13 15
4 11 12 16

Long to Wide mit pivot_longer()

Argumente:

  • cols 👉Welche Variablen sollen transformiert (also zusammengestapelt) werden?

  • names_to👉 Wie heisst die neue Variable, die den Messzeitpunkt (oder generell den ursprünglichen Spaltennamen) enthält?

  • values_to👉 Wie heisst die neue Variable, in der die Werte aus den ursprünglichen Spalten gespeichert werden?

df_long <- df_wide |>
  pivot_longer(
    cols = starts_with("messzeitpunkt_t"),
    names_to = "messzeitpunkt",
    values_to = "score"
  )

df_long[1:3, 1:3]
# A tibble: 3 × 3
     id messzeitpunkt    score
  <int> <chr>            <dbl>
1     1 messzeitpunkt_t1    10
2     1 messzeitpunkt_t2    14
3     1 messzeitpunkt_t3    18

Long to Wide mit pivot_wider()

Argumente:

  • names_from 👉Die Werte aus dieser Spalte (messzeitpunkt) werden wieder zu Spaltennamen.

  • values_from👉Die Werte aus dieser Spalte (score) füllen die neu entstandenen Spalten.

df_wide_again <- df_long |> 
  pivot_wider(
    names_from = messzeitpunkt,
    values_from = score
  )

df_wide_again[1:4, 1:4]
# A tibble: 4 × 4
     id messzeitpunkt_t1 messzeitpunkt_t2 messzeitpunkt_t3
  <int>            <dbl>            <dbl>            <dbl>
1     1               10               14               18
2     2               12               15               17
3     3                9               13               15
4     4               11               12               16

Paket tidyr

pivot_longer() und pivot_wider() stammen aus dem Paket tidyr - Teil des tidyverse

Cheatsheet tidyr

Umgang mit fehlenden Werten: drop_na(), replace_na() stammen auch aus tidyr

Wichtige Funktionen Datenaufbereitung:

aus Einführung in R, Kapitel 4.1

Hands On!

  • Code korrigieren / verbessern

  • Long Transformationen

Datenqualität:

  • Normalverteilung der Residuen
  • Schiefe /Skewness
  • Kurtosis / Kurtosis
  • Skalenreliabilität
  • Ausreisseranalyse

Paket: psych

Skewness / Kurtosis

Schiefe / Skewness: Funktion skew()

Kurtosis / Wölbung: Funktion kurtosi()

Residuen

Die Normalverteilung der Residuen ist eine Voraussetzung für viele statistische Tests.

Mögliche Arten, diese Annahme zu ueberprüfen:

  • Visuelle Verfahren (z.B. QQ-Plot)

  • Formale Tests (z. B. Shapiro-Wilk) –> “veraltete” Methode


Visuelle Verfahren werden heute meist bevorzugt, da sie weniger sensitiv gegenüber Stichprobengrössen sind.


Allerdings gilt: Verletzungen der Normalitätsannahme sind in der Praxis oft weniger problematisch als angenommen. Sollte es problematisch sein, kann auf nichtparametrische Verfahren ausgewichen werden.

Normalität der Residuen

Residuen: QQ-Plot

Zweck: QQ-Plots prüfen, ob die Daten einer theoretischen Verteilung (z. B. Normalverteilung) folgen.

  • X-Achse: Theoretische Quantile

  • Y-Achse: Beobachtete (empirische) Datenquantile

Ausreisser

Sollten in Abhängigkeit des Studiendesigns und der Fragestellungen in einer Präregistrierung oder einem Datenanalyseplan definiert werden.

z.B.:

  • Werte +/- 3 SD vom Gruppenmittelwert

  • Visuelle Ausreisser bei Boxplots und/oder Scatterplots

    ABER: Nur weil ein Wert extrem aussieht sollte man den nicht unüberlegt entfernen! Mehr dazu in Leys et al. (2019)

Ausreisser

Streudiagramme/Scatterplots

ggplot(data = penguins_dropped, aes( x = flipper_length_mm, y = body_mass_g))+
  geom_point()

Ausreisser

boxplot

Skalenreliabilität

  • Interne Konsistsenz (Cronbach’s Alpha)
#Mit psych Package
library(psych)

bfi_10_extra <- bfi_10_data |>
  select(bfi_extra_1_r, bfi_extra_2)

alpha(bfi_10_extra, check.keys = TRUE)

Reliability analysis   
Call: alpha(x = bfi_10_extra, check.keys = TRUE)

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean sd median_r
      0.76      0.76    0.62      0.62 3.2 0.085    3  1     0.62

    95% confidence boundaries 
         lower alpha upper
Feldt      0.5  0.76  0.89
Duhachek   0.6  0.76  0.93

 Reliability if an item is dropped:
              raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
bfi_extra_1_r      0.54      0.62    0.38      0.62 1.6       NA     0  0.62
bfi_extra_2        0.71      0.62    0.38      0.62 1.6       NA     0  0.62

 Item statistics 
               n raw.r std.r r.cor r.drop mean  sd
bfi_extra_1_r 29  0.89   0.9  0.71   0.62    3 1.1
bfi_extra_2   29  0.92   0.9  0.71   0.62    3 1.2

Non missing response frequency for each item
                 1    2    3    4    5 miss
bfi_extra_1_r 0.07 0.24 0.41 0.17 0.10 0.03
bfi_extra_2   0.10 0.28 0.28 0.21 0.14 0.03

Skalenreliabilität (2)


  • Test-Retest Reliabilität 👉 Korrelation zwischen Fragebögen an zwei Messzeitpunkten


  • Split-half Reliabilität 👉 Aufteilen des Fragebogens in zwei Hälften und deren Reliabilitäten (z.B. Cronbach‘s Alpha) vergleichen. Möglich mit der Funktion splitHalf() aus dem psych Paket.


Mehr Infos dazu: Psychometrics in R & Björn Walther

Heute haben wir:

  • Wide to long Transformationen gemacht - You mastered the tidyr!

  • Datenqualitätsindikatoren kennengelernt

Bis nächste Woche

  • Muddiest Points Umfrage bis Sonntag 23:55
  • Es gibt sonst keine HÜ - nutzt die Zeit verpasstes nachzuholen, schwierige Aspekte noch mal anzuschauen etc.
  • Lars kann bei Bedarf kontaktiert werden
  • Forum nutzen!

References:

Wickham H (2025). genzplyr: dplyr but make it bussin fr fr no cap. R package version 0.0.0.9000, https://github.com/hadley/genzplyr.

Leys, Christophe, Marie Delacre, Youri L. Mora, Daniël Lakens, and Christophe Ley. 2019. “How to Classify, Detect, and Manage Univariate and Multivariate Outliers, with Emphasis on Pre-Registration.” International Review of Social Psychology 32 (1). https://doi.org/10.5334/irsp.289.